// 首先，混合背包问题的状态表示都是f[i][j]，从前i个物品中选，体积不超过j的最大价值
// 因此，我们在判断第i个物品的时候，并不需要考虑前i个物品的状况，所以只需要分类对第i个物品求解即可
#include <iostream>
#include <algorithm>
using namespace std;

const int N = 1010;
int f[N];
int n, m;

int main()
{
    cin >> n >> m;
    while (n--)
    {
        int v, w, s;
        cin >> v >> w >> s;
        if (!s)
        {
            // 完全背包问题
            for (int j = v; j <= m; ++j)
                f[j] = max(f[j], f[j - v] + w);
        }
        else
        {
            if (s == -1)
                s = 1; // 将01背包问题看作是特殊的多重背包问题
            // 由于数据量比较大，需要使用二进制优化的多重背包问题
            for (int k = 1; k <= s; k *= 2)
            {
                for (int j = m; j >= k * v; --j)
                    f[j] = max(f[j], f[j - k * v] + k * w);
                s -= k;
            }
            // 二进制背包问题还要考虑是否还会有多余数量，还需要再做一遍01背包
            if (s)
            {
                for (int j = m; j >= s * v; --j)
                    f[j] = max(f[j], f[j - s * v] + s * w);
            }
        }
    }
    cout << f[m] << endl;
    return 0;
}